widget: Don't change sensitive state with insensitve parent
authorBenjamin Otte <otte@redhat.com>
Thu, 15 Dec 2011 19:32:54 +0000 (20:32 +0100)
committerBenjamin Otte <otte@redhat.com>
Fri, 16 Dec 2011 03:50:11 +0000 (04:50 +0100)
This way child.set_sensitive(True) with an insensitive parent doesn't
cause child to become sensitive.

gtk/gtkwidget.c

index 47887470e0e1dcf6611f533e7923189eaf4f57f1..7c189c4271b36bfacefd0afd1248de340cd63e6e 100644 (file)
@@ -7663,7 +7663,6 @@ gtk_widget_set_sensitive (GtkWidget *widget,
                          gboolean   sensitive)
 {
   GtkWidgetPrivate *priv;
-  GtkStateData data;
 
   g_return_if_fail (GTK_IS_WIDGET (widget));
 
@@ -7674,24 +7673,30 @@ gtk_widget_set_sensitive (GtkWidget *widget,
   if (priv->sensitive == sensitive)
     return;
 
-  data.flags = GTK_STATE_FLAG_INSENSITIVE;
-
-  if (sensitive)
-    {
-      priv->sensitive = TRUE;
-      data.operation = STATE_CHANGE_UNSET;
-    }
-  else
+  if (priv->parent == NULL
+      || gtk_widget_is_sensitive (priv->parent))
     {
-      priv->sensitive = FALSE;
-      data.operation = STATE_CHANGE_SET;
-    }
+      GtkStateData data;
 
-  data.use_forall = TRUE;
+      data.flags = GTK_STATE_FLAG_INSENSITIVE;
 
-  gtk_widget_propagate_state (widget, &data);
+      if (sensitive)
+        {
+          priv->sensitive = TRUE;
+          data.operation = STATE_CHANGE_UNSET;
+        }
+      else
+        {
+          priv->sensitive = FALSE;
+          data.operation = STATE_CHANGE_SET;
+        }
 
-  gtk_widget_queue_resize (widget);
+      data.use_forall = TRUE;
+
+      gtk_widget_propagate_state (widget, &data);
+
+      gtk_widget_queue_resize (widget);
+    }
 
   g_object_notify (G_OBJECT (widget), "sensitive");
 }